package com.shujia.scala

object Demo16Fun {
  def main(args: Array[String]): Unit = {
    val arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

    //定义一个参数为Int没有返回值的函数
    def fun(i: Int): Unit = {
      println("fun")
      println(i)
    }

    /**
     * foreach: 循环数组中的元素，将数组中的元素一个一个传递给后面的函数
     */
    arr.foreach(fun)
    println("=" * 100)

    /**
     * 使用lambda表达式作为参数
     */
    //i代表的是数组中的元素，foreach会循环将数组的元素传递给后面的函数
    arr.foreach((i: Int) => {
      println(i)
    })
    println("=" * 100)
    //简写：如果函数的逻辑只有一行可以省略{}
    arr.foreach((i: Int) => println(i))

    println("=" * 100)
    //简写：函数参数的类型可以自动推断
    arr.foreach(i => println(i))

    println("=" * 100)
    //简写：如果参数只使用了一次可以使用下划线代替
    arr.foreach(println(_))

    println("=" * 100)

    /**
     * 直接传入println
     * def println(x: Any) = Console.println(x)
     * println是一个参数为Any返回值为Unit的函数
     * foreach需要一个参数为Int返回值为Unit函数
     *
     * 再scala一函数作为参数编程中同样满足多态思想
     *
     */
    arr.foreach(println)

    /**
     * 计算累计和
     */

    var sum = 0
    arr.foreach((i: Int) => {
      //再函数内使用函数外的一个变量（闭包）
      sum += i
    })

    println(sum)

  }


}
